package com.cskaoyan.javase.oop1._12block._1building._0introduction;

/**
 * 构造代码块
 * 定义在类的成员位置，使用以下声明方式声明的代码块，称之为构造代码块。
 * //成员位置
 * {
 *   // 局部位置
 * }
 * //成员位置
 *
 * 构造代码块的作用:
 * 随着构造器的执行而执行，用于在new创建对象过程当中，给成员变量赋值！！
 * 所以构造代码块的作用和构造器作用一样,都是在new对象过程中,给成员变量赋值
 * 注意:
 *      构造代码块之所以可以直接给成员变量赋值
 *      这是因为构造代码块中也可以使用this关键字,指向当前对象
 *
 * 总结目前为止,new对象过程中,给成员变量赋值的手段:
 *      1.默认初始化,具有默认值
 *      2.显式赋值
 *      3.构造器赋值
 *      4.构造代码块赋值
 * 以上四种,"掐头去尾",默认初始化永远最先执行,构造器赋值最后执行
 * 那么显式赋值和构造代码块赋值是如何执行的呢?
 *
 * 它们的执行顺序是不是固定死的,而是按照代码的书写顺序,从上往下执行
 * 谁写在代码顺序的上面,它就先执行,先执行就会被覆盖
 * 谁写在代码顺序的下面,它就后执行,后执行就是最终结果
 *
 * 以上,构造代码块的使用就完了.
 *
 * 构造代码块的原理/构造代码块为什么随着构造器执行/构造代码块的执行特点:
 *      1.(了解)编译后的字节码文件中,是没有构造代码块的结构的
 *      而是编译器"智能的"将显式赋值的代码以及构造代码块中的代码
 *      放入构造器中
 *      所谓的"智能" 是为了保证显式赋值和构造代码块按照代码书写顺序,从上往下执行
 *
 *      2.(重点)构造代码块中的代码最终会智能的加入构造器,而且是加入类的每一个构造器
 *          在一次new对象的过程中,构造器可以执行多个(因为有this)
 *          但是显式赋值和构造代码块赋值,最多执行一次
 *          除非构造器中有this调用别的构造器,该构造器下就不能加入构造代码块代码了(为了防止构造代码块被执行两次)
 *
 * @since 17:34
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // Student s = new Student();
        // System.out.println(s.age);

        Student s = new Student(18);
    }
}

class Student {



    int age = 20;

    // 构造代码块
    {
        this.age = 10;
    }


    public Student() {
    }

    public Student(int age) {
        this();
        this.age = age;
    }
}